#include   <stdio.h>
/*
字符串
    在C语言中没有字符串类型

    要使用字符串 需要用到 char 数组
    用char类型的数组是创建了N多个格子 ，然后我们需要向着个格子填充字符

字符串末尾如何知道
    在系统中规定， 字符串 以 ascii 码中 的 0 为结尾
    ascii 码中 的 0  -->>  '\0'

在文件中 通过 EOF 知道文件末尾
    


知道末尾
    字符串求长度            my_strlen
    
    字符串 查 字符          my_strchar

    字符串 查 子串          my_strstr   用的最笨的方式
    
    字符串 对比 字符串      my_strcmp

    字符串 赋值             my_strcpy

    字符串 连接             my_strcat
    
*/

// 求字符串长度   求长度 不包含  \0    123、0
int my_strlen(char * s1)
{

    if(NULL == s1)
    {
        printf("传入的指针不对\n");
        return -1;
    }

    // 求长度
    
    int len = 0;

    for (size_t i = 0; s1[i] != '\0'; i++ , len++ ) {  }
    //printf("%d",len);
    return len;

}


char * my_strchar(char * s1 , char ch)
{
    if(NULL == s1)
    {
        printf("传入的指针不对\n");
        return NULL;
    }

    // 求字符所在位置

    for (size_t i = 0; s1[i] != '\0'; i++)
    {
        if (ch == s1[i])
        {
            // 找到了
            return &s1[i];
        }
    }

    return NULL;
    
}


char * my_strstr(char * s1 , char * s2)
{
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return NULL;
    }

    // 朴素算法
    for (size_t i = 0; i < my_strlen(s1) -  my_strlen(s2); i++)
    {
        if (s1[i] == s2[0])
        {
            for (size_t j = 0; j < my_strlen(s2) + 1 ; j++)
            {   
                // 找到了
                if ('\0' == s2[j] )
                {
                    return &s1[i];
                }
                // 匹配
                if(s1[i + j ] == s2[j])
                {
                    continue;
                }
                // 不匹配
                else
                {
                    break;
                }
            }
        }
    }

    return NULL;
    
}


char my_strcmp(char * s1 , char *s2)
{
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return -1;
    }

    // s1 = 1234567
    // s2 = 123456

    // 长度是否相同
    if(my_strlen(s1) != my_strlen(s2))
    {
        return -1;
    }

    // 字符是否匹配
    for (size_t i = 0; s1[i] != '\0'; i++)
    {
        if(s1[i] != s2[i])
        {
            return s1[i] - s2[i];
        }
    }
    

    return 0;
}

char * my_strcpy(char * s1  , char * s2)
{
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return NULL;
    }

    // 对s1 赋值
    for (size_t i = 0; i < my_strlen(s2); i++)
    {
        s1[i] = s2[i];
    }
    // 追加尾0
    s1[my_strlen(s2)] = '\0';

    return s1;
    
}


char * my_strcat(char * s1 , char * s2)
{
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return NULL;
    }

    for (size_t i = 0 , j = my_strlen(s1) ; i < my_strlen(s2) ;  i++ , j++)
    {
        s1[j] = s2[i];
    }

    return s1;

    
}


int main(int argc, char const *argv[])
{
    char buf[128] = "helloprintf";
    char buf_cmp[128] = "helloprint";

    
    char buf_1[128] = { 104 , 101 , '\0' , 108 , 111  };
    char buf_2[128] = { 'h' , 'e' , '\0' , 'l' , 'o'  };

    // 求长度 demo
    printf("buf 长度为 %d\n", my_strlen(buf));

    // 字符串 找 字符
    char * p = my_strchar(buf , 'p');
    printf("字符 找到了 : %s\n" , p);

    // 字符串 找 字符串
    char * p_str = my_strstr(buf , "print");
    printf("字符串 找到了 : %s\n" , p_str);

    // 字符串 对比字符串
    char ret = my_strcmp(buf , buf_cmp);
    if(0 == ret)
    {
        printf("相同\n");
    }
    else{
        printf("不相同\n");
    }

    // 字符串 拷贝
    printf("buf = 小谭老师真帅 = %s\n" , my_strcpy(buf, "小谭老师真帅"));
    

    // 字符串 连接
    printf("buf += ,这是真话 = %s\n" , my_strcat(buf, ",这是真话"));


    return 0;
}
